//////////////////////////////////////////////////////////////////////
//
// NO_TypeID.cpp interface for the NO_HelperTypeID class.
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#define NO_TAL_EXPORT

//////////////////////////////////////////////////////////////////////////
#include "NO_Externs.h"
#include "NO_TypeID.h"

///////////////////////////////////////////////////////////////////////
// NO_HelperTypeID
///////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_Type::InternTypeIter NO_HelperTypeID::endIntern(void)				{return NO_Type::endIntern();}
NO_Type::GlobalTypeIter NO_HelperTypeID::endGlobal(void)				{return NO_Type::endGlobal();}
NO_Type::InternTypeIter NO_HelperTypeID::findIntern(type_info const & r){return NO_Type::findIntern(r);}
NO_Type::GlobalTypeIter NO_HelperTypeID::findGlobal(NO_UInt32 ID)		{return NO_Type::findGlobal(ID);}
NO_Type::GlobalTypeIter NO_HelperTypeID::findGlobal(std::string& i)		{return NO_Type::findGlobal(noGetHash(i.c_str()));}
NO_Type::GlobalTypeIter NO_HelperTypeID::findGlobal(NO_Int8 const * i)	{return NO_Type::findGlobal(noGetHash(i));}

//////////////////////////////////////////////////////////////////////////
void NO_HelperTypeID::registerHandler(type_info const & r, NO_TypeHandler& h)
{
	NO_Type::InternTypeIter iter = NO_Type::findIntern(r);
	if(iter==NO_Type::endIntern())
	{
		std::stringstream str;
		str<<"Type ("<<r.name()<<") not registered.";
		throw std::exception(str.str().c_str());
	}
	iter->second->registerHandler(h);
}

//////////////////////////////////////////////////////////////////////////
// UnknownType
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_Type& NO_TypeID<NO_UnknownType>::type(NO_UInt32 ID)	
{
	NO_Type::GlobalTypeIter iter = NO_HelperTypeID::findGlobal(ID);
	if(iter==NO_HelperTypeID::endGlobal()){throw std::exception("Type by ID not found");}
	return *iter;
}

//////////////////////////////////////////////////////////////////////////
const NO_Type& NO_TypeID<NO_UnknownType>::type(std::string& identifier)				
{
	NO_Type::GlobalTypeIter iter = NO_HelperTypeID::findGlobal(identifier);
	if(iter==NO_HelperTypeID::endGlobal()){throw std::exception("Type by name not found");}
	return *iter;
}

//////////////////////////////////////////////////////////////////////////
const NO_Type& NO_TypeID<NO_UnknownType>::type(NO_Int8 const * identifier)				
{
	NO_Type::GlobalTypeIter iter = NO_HelperTypeID::findGlobal(identifier);
	if(iter==NO_HelperTypeID::endGlobal()){throw std::exception("Type by name  not found");}
	return *iter;
}

//////////////////////////////////////////////////////////////////////////
const NO_Type& NO_TypeID<NO_UnknownType>::type(type_info const & rtti)				
{
	NO_Type::InternTypeIter iter = NO_HelperTypeID::findIntern(rtti);
	if(iter==NO_HelperTypeID::endIntern()){throw std::exception("Type by rtti not found");}
	return (*(iter->second));
}
